<?php
/**
 * Created by PhpStorm.
 * User: admin
 * Date: 2021.3.23
 * Time: 15:36
 */

class A {
    protected $ioc;

    public function __construct(Ioc $ioc)
    {
        $this->ioc = $ioc;
    }

    public function getB()
    {
        return $this->ioc->make('b');
    }
}

class Ioc
{
    protected $instances = [];

    public function __construct()
    {
        $this->instances['a'] = new A($this);
        $this->instances['b'] = new B($this);
    }

    public function make($abstract)
    {
        return $this->instances[$abstract];
    }
}

class B
{
    protected $ioc;

    public function __construct(Ioc $ioc)
    {
        $this->ioc = $ioc;
    }

    public function hello()
    {
        echo "hello";
    }
}
$ioc = new Ioc();
$a = $ioc->make('a');
$b = $a->getB();
$b->hello();
/**
 * 从数据类型本质上来说，laravel 服务容器就是一个类，PHP 解析过程中会被实例化为一个对象。我们都知道PHP实例化类要调用
 * 类的构造方法的，而这个执行构造方法的过程就是服务容器初始化的过程。
 *
 *
 */